<?php 
/**
 * Erzeugt ein Array für das Infomessage-Template.
 *
 * Diese Funktion erzeugt eine Array für unsere Templateengine die dann
 * die Infomessage-Template-Datei "info.tpl" läd. Der Parameter gibt
 * dabei die Nachricht an die angezeigt werden soll.
 *
 * @param msg Die Nachricht die angezeigt werden soll.
 * @return Das Array für unsere Templateengine.
 */
function showInfo($msg) {
    $ret = array();
    $ret['filename'] = 'info.tpl';
    $ret['data'] = array();
    $ret['data']['msg'] = $msg;
    return $ret;
}

/**
 * Liefert die Benutzer-ID zurück.
 *
 * Diese Funktion liefert die Benutzer-ID des angemeldeten Benutzers zurück.
 * Falls kein Benutzer angemeldet ist liefert diese Funktion den Wert false
 * zurück. 
 * 
 * Diese Funktion öffnet die Session und liest die Benutzer ID aus.
 * Sollte keine Benutzer ID gesetz sein, so st der Benutzer auch nicht angemeldet.
 */
function getUserID() {

	if (!isset($_SESSION['userid'])) {
		return null;
	}
	
	return $_SESSION['userid'];
}

/**
 * Prüft ob der aktuell eingeloggte User
 * die übergebene url aufrufen darf
 * @param string $url der Name des URL
 */
function hasPermission($url) {
	$userrightDAO = DAOFactory::getInstance('Userright');
	$rightDAO = DAOFactory::getInstance('Right');
	$accessrightDAO = DAOFactory::getInstance('Accessright');
	
	// Als erstes Prüfen, ob das Recht All an der URL hängt
	if ($accessrightDAO->get(new Accessright($url, $rightDAO->getByName('All')->get_id()))) {
		return true;
	}
	
	// Die Userid holen
	if (!$userid = getUserID()) {
		// debug
		if (DEBUG_ENABLED)
			DebugQuery::getInstance()->append("There is no User logged in.\n");
		return null;
	}

	// Alle Rechte des Benutzers laden
	if (!$userrights = $userrightDAO->getByUserId($userid)) {
		// debug
		if (DEBUG_ENABLED)
			DebugQuery::getInstance()->append("Error loading userrights for id '%d' : %s\n", $userid, $userrightDAO->get_error());
		return null;
	}
	
	// Für jedes Recht des Benutzers prfen, ob damit die URL aufgerufen werden darf
	foreach($userrights as $right) {
		if ($accessrightDAO->get(new Accessright($url, $right->get_rightid()))) {
			return true;
		}
	}
	
	return false;
}

/**
 * Diese Funktion lädt automatisch die gewüschten Klassen, wenn diese in classes/
 * existieren.
 * 
 * Diese Funktion muss via spl_autoload_register registriert werden
 * 
 * @param string $class_name Name of the class
 * @throws Exception ERR_CLASS_NOT_FOUND
 */
function autoload($class_name) {

	include 'classpath.php';
	
	// debug
	if (DEBUG_ENABLED)
		$debug = DebugQuery::getInstance();
	
	// debug
	if (DEBUG_ENABLED)
		$debug->append("Searching for class: %s\n", $class_name);
		
	// Alle validen class Verzeichnisse durchsuchen,
	// bis die erste gefunden wurde, die auf den Namen matched
	foreach ($class_path as $value) {
		// Filename bauen
		$filename = $value . $class_name .'.php';
		
		if (file_exists($filename)) {
			// debug
			if (DEBUG_ENABLED)
				$debug->append("Loading class: %s\n", $filename);
				
				// Die gefundene Klasse laden
				include $filename;
				
				return;
		}
	}
	
	// debug
	if (DEBUG_ENABLED)
		$debug->append("Class not found: %s\n", $class_name);

	// An dieser Stelle ist klar: Die Klasse gibt es nicht
	throw new Exception(ERR_CLASS_NOT_FOUND);
}

/**
 * Diese Function soll als Top Level Exception handler
 * definiert werden, um alle Exceptions abzufangen, die nicht 
 * in einem catch gefangen werden.
 * 
 * @param Exception $e
 */
function uncaught_exception_handler($e) {
	printf("Uncaught Exception occured: %s\n", $e->getMessage());
}

?>